package com.baichang.taoshunda.controller;

import cn.jpush.api.push.model.Message;
import com.alipay.util.AlipayNotify;
import com.baichang.framework.controller.BaseController;
import com.baichang.framework.excelption.ServiceException;
import com.baichang.framework.utils.LogUtils;
import com.baichang.taoshunda.dao.OrderDao;
import com.baichang.taoshunda.entity.Bussiness;
import com.baichang.taoshunda.entity.Order;
import com.baichang.taoshunda.service.BalanceDetailsService;
import com.baichang.taoshunda.service.BusinessService;
import com.baichang.taoshunda.service.OrderService;
import com.baichang.taoshunda.utils.UserJPushHelper;
import com.baichang.taoshunda.utils.UserPushMsgUtil;
import com.baichang.taoshunda.weixin.tencent.XMLParser;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by Dylan on 2017/6/20.
 */
@Controller
@RequestMapping(ControllerConstants.PAY)
public class PayController extends BaseController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private BalanceDetailsService balanceDetailsService;
    @Autowired
    private OrderDao orderDao;
    @Autowired
    private BusinessService businessService;

    /**
     * 支付宝回调
     *
     * @param request
     * @param response
     * @return
     * @throws ServiceException
     */
    @RequestMapping("/aliPayNotify")
    public void aliPayNotify(HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws ServiceException {

//        return NotifyUrl.notifyOrder(request, new com.alipay.api.IPay() {
//            @Override
//            public void success(String orderNumber, String tradeNod) throws ServiceException {//商户订单号，也是我们生成的交易号；支付宝交易号
//                System.out.println("------------------------------------------------------------------");
//                System.out.print(orderNumber);
//                    orderService.updateOrderStateByOrderNumber(orderNumber);
//
//            }
//        });
        // 获取支付宝POST过来反馈信息
        try {
            Map<String, String> params = new HashMap<String, String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                // 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
                // try {
                // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
                // } catch (UnsupportedEncodingException e) {
                // e.printStackTrace();
                // }
                LogUtils.getInstance().info(valueStr);
                params.put(name, valueStr);
            }

            // 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

            // 商户订单号
            String out_trade_no = null;

            // 支付宝交易号
            String trade_no = null;

            // 交易状态
            String trade_status = null;

            try {
                out_trade_no = new String(request.getParameter("out_trade_no")
                        .getBytes("ISO-8859-1"), "UTF-8");
                System.out.println("=========================================================================================================" + out_trade_no);
                trade_no = new String(request.getParameter("trade_no").getBytes(
                        "ISO-8859-1"), "UTF-8");
                trade_status = new String(request.getParameter("trade_status")
                        .getBytes("ISO-8859-1"), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                System.out.println("=========================================================================================================获取不到信息");
                e.printStackTrace();
            }

            // 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
            if (AlipayNotify.verify(params)) {// 验证成功
                // ////////////////////////////////////////////////////////////////////////////////////////
                // 请在这里加上商户的业务逻辑程序代码

                // ——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

                if (trade_status.equals("TRADE_FINISHED")) {
                    // 判断该笔订单是否在商户网站中已经做过处理
                    // 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                    // 如果有做过处理，不执行商户的业务程序

                    // 注意：
                    // 该种交易状态只在两种情况下出现
                    // 1、开通了普通即时到账，买家付款成功后。
                    // 2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
                } else if (trade_status.equals("TRADE_SUCCESS")) {
                    // 判断该笔订单是否在商户网站中已经做过处理
                    // 如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                    // 如果有做过处理，不执行商户的业务程序
                    Order order = orderDao.getOrderByPayOrderNumber(out_trade_no);
                    if (order.getOrderState() == 1) {
                        orderService.updateOrderStateByOrderNumber(out_trade_no);
                        balanceDetailsService.saveBalanceDetail(order.getOrderNumber());
                        Bussiness bussiness = businessService.getBusinessById(order.getSellerId());
                        UserPushMsgUtil.sumbitOrderPush(order.getId(), order.getBuyerId(), bussiness.getAccount(), order.getOrderNumber(),order.getOrderType());
                        JSONObject object = JSONObject.fromObject(order);
                        Map<String, String> map = object;
                        UserJPushHelper companyJPushHelper = new UserJPushHelper("business.properties");
                        companyJPushHelper.sendMsgByAlias(Message.newBuilder().setMsgContent("").addExtras(map).build(), bussiness.getAccount());
                    }

                    // 注意：
                    // 该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
                }

                // ——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

                out.println("success"); // 请不要修改或删除

                // ////////////////////////////////////////////////////////////////////////////////////////
            } else {// 验证失败
                out.println("fail");
            }
        } catch (Exception e) {
            LogUtils.getInstance().error(e);
            out.println("fail");
        }
    }

    /**
     * 微信回调
     *
     * @param request
     * @param response
     * @param xml
     * @param writer
     * @throws ServiceException
     */
    @RequestMapping("/weiXinNotify")
    public void success(HttpServletRequest request,
                        HttpServletResponse response, @RequestBody String xml,
                        PrintWriter writer) throws ServiceException {
        response.resetBuffer();
        response.setContentType("text/xml; charset=UTF-8");
        try {
            // 创建请求对象
            Map<String, String> map = XMLParser.xml2map(xml);
            if ("SUCCESS".equals(map.get("return_code"))) {
                String out_trade_no = map.get("out_trade_no");
                Order order = orderDao.getOrderByPayOrderNumber(out_trade_no);
                if (order.getOrderState() == 1) {
                    orderService.updateOrderStateByOrderNumber(out_trade_no);
                    balanceDetailsService.saveBalanceDetail(order.getOrderNumber());
                    Bussiness bussiness = businessService.getBusinessById(order.getSellerId());
                    UserPushMsgUtil.sumbitOrderPush(order.getId(), order.getBuyerId(), bussiness.getAccount(), order.getOrderNumber(), order.getOrderType());
                    JSONObject object = JSONObject.fromObject(order);
                    Map<String, String> pushMsg = object;
                    UserJPushHelper companyJPushHelper = new UserJPushHelper("business.properties");
                    companyJPushHelper.sendMsgByAlias(Message.newBuilder().setMsgContent("").addExtras(pushMsg).build(), bussiness.getAccount());
                }

                String returnXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
                writer.print(returnXml);
                writer.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}